Spring Data Redis与Redisson对比

Spring Data Redis与Redisson对比

Spring Data Redis

Spring Data Redis是更大的Spring Data系列的一部分,可以从Spring应用程序轻松配置和访问Redis。它提供了与商店交互的低级和高级抽象,使用户免于基础设施问题。Spring Boot 从 2.0版本开始,将默认的Redis客户端Jedis替换问Lettuce。

特性

  • 连接包作为多个Redis驱动程序/连接器的低级抽象(JedisLettuce。不推荐支持JRedisSRP。)
  • 异常转换到Spring的便携式数据访问异常层次结构Redis的驱动程序例外
  • RedisTemplate,提供高级抽象,用于执行各种Redis操作,异常转换和序列化支持
  • Pubsub支持(例如消息驱动的POJO的MessageListenerContainer)
  • Redis SentinelRedis Cluster支持
  • JDK,String,JSON和Spring Object / XML映射序列化程序
  • 在Redis之上的JDK Collection实现
  • 原子计数器支持classes
  • 排序和流水线功能
  • 专门支持SORT,SORT / GET模式和返回的批量值
  • Redis 实现了Spring 3.1缓存抽象
  • 自动实现Repository接口,包括支持自定义查找程序方法@EnableRedisRepositories
  • CDI对存储库的支持

使用

pom.xml中加入

1
2
3
4
5
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>

application.yml中加入

1
2
3
4
5
6
7
8
9
10
11
12
spring:
redis:
database: 6 #Redis索引0~15,默认为0
host: 127.0.0.1
port: 6379
password: #密码(默认为空)
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms #连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 5 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
timeout: 10000ms #连接超时时间(毫秒)

加入配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {

/**
* RedisTemplate配置
*
* @param redisConnectionFactory redisConnectionFactory
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//value序列化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

}

代码使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

@Autowired
private RedisTemplate redisTemplate;

@Autowired
private RedisConnectionFactory redisConnectionFactory;

@SuppressWarnings("unchecked")
public void test(){
//设置键值对
redisTemplate.opsForValue().set("test:set1", "testValue1");
//设置键值对数组
redisTemplate.opsForSet().add("test:set2", "asdf");
//数据hash存入
redisTemplate.opsForHash().put("hash1", "name1", "lms1");
redisTemplate.opsForHash().put("hash1", "name2", "lms2");
redisTemplate.opsForHash().put("hash1", "name3", "lms3");
//获取
System.out.println(redisTemplate.opsForValue().get("test:set"));
//hash获取
System.out.println(redisTemplate.opsForHash().get("hash1", "name1"));
//发布、订阅消息(更多请参考 https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/
String message = "dinghuang123@gmail.com";
byte[] msg = message.getBytes();
byte[] channel = message.getBytes();
redisConnectionFactory.getConnection().publish(msg, channel);
redisTemplate.convertAndSend("hello!", "world");
}

如图所示

Redisson

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。能够完美的在云计算环境里使用,并且支持AWS ElastiCache主备版,AWS ElastiCache集群版,Azure Redis Cache和阿里云(Aliyun)的云数据库Redis版。Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。

Redisson作为独立节点 可以用于独立执行其他节点发布到分布式执行服务 和 分布式调度任务服务 里的远程任务。

特性

与spring-data-redis结合使用

pom.xml加入依赖

1
2
3
4
5
6
7
8
9
10
 <dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-21</artifactId>
<version>3.10.5</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>

resources文件夹添加配置文件redisson.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#Redisson配置
singleServerConfig:
address: "redis://127.0.0.1:6379"
password: null
clientName: null
database: 7 #选择使用哪个数据库0~15
idleConnectionTimeout: 10000
pingTimeout: 1000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
reconnectionTimeout: 3000
failedAttempts: 3
subscriptionsPerConnection: 5
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
connectionMinimumIdleSize: 32
connectionPoolSize: 64
dnsMonitoringInterval: 5000
#dnsMonitoring: false

threads: 0
nettyThreads: 0
codec:
class: "org.redisson.codec.JsonJacksonCodec"
transportMode: "NIO"

注册RedissonConnectionFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class RedissonSpringDataConfig {

@Bean
public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
return new RedissonConnectionFactory(redisson);
}

@Bean(destroyMethod = "shutdown")
public RedissonClient redisson(@Value("classpath:/redisson.yml") Resource configFile) throws IOException {
Config config = Config.fromYAML(configFile.getInputStream());
return Redisson.create(config);
}

}

代码使用

1
2
3
4
5
6
7
8
9
@Autowired
private RedissonClient redissonClient;

@SuppressWarnings("unchecked")
public void test(){
//设置键值对
RBucket<String> keyObj = redissonClient.getBucket("k1");
keyObj.set("v1236");
}

结论

spring-data-redis 支持的基本能够满足对redis的操作,提供了2种客户端连接,也支持redis集群的模式。如果涉及到利用redis做分布式锁的话,redisson封装了更多的工具和基础原子对象进行操作,redisson是优先选择,其次redisson兼容了很多的框架,那么多star不是没有道理的= =。同时也可以通过redisson与RxJava结合,实现线程安全的异步任务等等。